We do this for many many Drupal sites on many horizontal web nodes via bzr + ant. By 'sites' I mean no multi-site; each 'site' gets its own Drupal instance. By 'Drupal instance', I mean the 'Drupal instance' is an ant-powered deploy from a branch in bzr comprised of vendor branches (core + modules) merged in plus customizations by our shop. Each environment gets a branch, and we merge code upstream (dev -> tst -> prd).
The only thing 'shared' across the infrastructure is the web services and frameworks on the webapp nodes. Ant is great at auto-magic MySQL db provisioning, Drush calls to pound the schema, APC cache flushes, Memcached bops, etc. Also I would throw myself off a bridge if I had to manage all the complex merges across our branches and dealing with updating the vendor branches.
Others here also made the comment wrt code up, content down. Live it, love it; SERIOUSLY! Refresh often, and give your devs anonymized slices of the db for them to keep on a laptop they will undoubtedly leave in a cab. Were currently bending ant to perform the downstream refreshes + sanitizes. Looks very promising.
Also if youre not able to bastardize ant to do what you want it to do, look at ant-contrib to further extend the tool.
Slightly OT: The J2EE guys at $employer prefer a maven+ant+svn approach. YMMV.
Have fun. These are very interesting toys to play with, tbh.