Due to old style platforms, backwards compatibility
I've been waiting for a while for one of the major computer platforms to support bytecode natively, perhaps in a co-processor. I think it'll happen someday. As far as .Net goes, I imagine the reason why you still have to load 2 gigs of stuff is that customers haven't adopted the newest Windows platforms to a great extent. .Net was supposed to be included with the OS since Vista.
Anyway, for one thing, with the languages that are used today, they're not called "virtual machines" for nothing. They are primitive computers in software, but they work differently than the computer hardware. The native computer hardware is designed for a bygone era. It only understands machine codes, primitive addressing, and a primitive stack. It doesn't understand garbage collection. It doesn't bytecode. It doesn't understand types, much less bounded ones. It doesn't understand references (only pointers/addresses). It doesn't understand access restrictions to objects/data. The underlying machine doesn't understand how to support the debugging of this kind of stuff. It doesn't understand how to parse or generate anything.
The hardware does understand how to move data around (like a graphic object on a screen), and translate digital to audio, and vice-versa. Some hardware platforms understand the concept of protected memory so worms can't propagate. VMs take advantage of that.
But currently, all of the stuff the hardware doesn't understand has to either be incorporated into the OS, or come separately.
If a machine were built to handle the things I talk about above, which they can't do now, it would be incompatible with all the software that's compiled down to "native code". The machine that "native code" could run on would have to be emulated (with a VM). Also the C language would have to be modified to either not use pointers, or just emulate them (Go, anyone?). Microsoft has already done this to C++ when the compiler is set to use managed code, though I think it's still possible to mix native pointers with managed code. A dicey mix.