I'm in the process of porting Ukulele/Tom to Django to simplify my deployment.
This site is hosted by Slicehost, a Virtual Private Server provider. It's great stuff - VPS systems allow you to install and manage software with complete freedom. The only restriction - and, in the end, a fairly prominent one - is that memory is limited to as low as 64MB. In my case, I have 256MB to work with. This leads to one major difference between this and, say, Dreamhost. Instead of running various languages through mod_php and other Apache modules, you'll end up with a slightly more complex 'stack' with this setup.
Essentially, developers keep memory consumption low by offloading simple operations - like serving static files - to simple applications - Nginx, Lighttpd, etc. I use Nginx, because Lighttpd has a fairly serious memory leak, which I simply wouldn't want to deal with.
Use Nginx to proxy to other services: essentially, Nginx receives the HTTP request from the magical DNS world and either serves a static file directly, or defers the request to another system. A simple way to do this is to have each application run on a separate port. A little wrinkle is that it might be tempting to have Apache serve different sites on different ports - this becomes rather funky if you want to do something complex, like wildcard subdomains. The trick is to be careful sending the "Host:" header from Nginx - and then using name-based virtual hosts in Apache.