The truth of it is every install of an operating system is different. Your goal when testing is to make sure your environment is as controlled as possible. This is both easier and harder with virtual machines.
The advantages are that you can create a brand new machine from an image in a matter of seconds. This lets you have the application get a fresh install (so no corruption from previous tests.) Control over your environment is paramount.
The major disadvantage is the shared processor/memory state. This is where your control over the environment starts to fall apart. What if someone else is doing something intensive and you don't have the resources it says you do?
At my last job, we used VMs for our automated nightly tests and it worked out great. We knew they had the resources and a fresh environment. We also had VMs of the various systems we supported. It worked like a charm.
Welcome to the era of the cloud.
For the record, we used VMWare. I'm not endorsing it or anything. It was easy to use, but I don't have a standard of comparison, nor did I do too much of the heavy lifting (although I did write Groovy integrations for starting and stopping VMs and that was pretty easy.)