Well but they are Java based VMs running on top of the kernel. Why can't they scratch that and instead write it in a C variant and abolish the VM model? I am sure it will work out far better.
How would it be better ? In terms of ease of deployment for 3rd parties, it would add unnecessary steps of recompiling a binary for every known architecture, so it would hurt portability. Remember,. Android doesn't just run on top of ARM, there are devices out there that use Intel's x86 based Medfield platform. The Davlik VM gives them to opportunity of making that transparent to developers and users who can just buy apps whatever their device's SoC architecture.
Performance ? Debateable. Davlik and other VMs are nowadays quite efficient at certain operations, and with JIT compilation and bytecode interpretation hybrid models, they can on the fly optimize certain portions of code that execute frequently without incurring the penalty of compiling the bytecode on every launch.
Then there's the added complexities of these lower level languages, like memory management (especially memory management in the case of C).
But that only applies to 3rd party developers. Davlik itself is written in C++ (can't really execute itself now can it...) and probably most of the display server is also not executed within Davlik either. Then there's the NDK for those devs that really need lower level access and are ready to sacrifice the RAD environnement provided by Android's frameworks.
In the end, they are no less true Linux OSes. Linux is a kernel, it doesn't really define the userspace requirements. Busybox, GNU, a custom userspace like Android or even WebOS, it's all moot, the kernel doesn't care. It scedules processes, provides a VFS layer to organize storage into a single syscall interface, provides networking and a HAL.