Have to agree with Howard - VMs are good for small workloads, but any taxing workload needs to run on bare metal (or on a sandboxing scheme that runs at bare metal speed like Solaris Zones).
Having said that, here's something that is worth considering: a lot of people using VMs split frontend (FE) and backend (BE) - the DB -, just because they can. And it's a huge mis-optimisation.
When you have Apache/PHP and MySQL/Pg on the same box, they can communicate via a socket (and make sure they do by not giving Moodle a host:port combo to connect to). This socket connection is extremely fast and low latency.
If you split things, you increase latency on every SQL connection, on every query. This means each HTTP request takes longer to serve, which means you might serve theoretically the same # per second (assuming the FE is the bottleneck) but you have more Apache/PHP processes waiting on the FE. This in turn means significantly more memory use in the FE, and a lot of processes there just anxiously waiting for their data from the BE.
So the FE/BE split is only recommended if you have several (real, physical) FE machines. And when you do it, you must work on the network throughput and latency between them.