It depends on what you want. Ultimately, the holy grail is being able to build, today, a bit-for-bit identical binary to whatever you are running in production that you built a day, a week, or a month ago. That way, if you need to debug something obscure, you're not adding extra variables to the equation.
But most people just want to be able to write two apps that use different libraries, and for that, virtualenv is fine.
But most people just want to be able to write two apps that use different libraries, and for that, virtualenv is fine.