I'm convinced that Java isn't really much slower than native code for most purposes....... except......
What continues to drive me to use native code sometimes is the lack of support within Java for the vector processing units found on modern CPUs. It's not really viable to use Java to write applications involving signal processing (audio apps, for eg.), video processing, games etc. until we can use the hardware that's available for doing that kind of thing.
I use a G5 Macintosh which has a monster vector processor in it, and I do a lot of code that can often run more than 5 times faster when the vector unit is being used properly. But if I code in Java I have to ignore all that power - it just sits idle, and for quite a few applications I have to abandon Java and descend back into the swamp because Java just isn't fast enough.
Implementing vector types in Java (and ideally a bunch of useful vector code like FFTs etc.) and letting the VM worry about the quirks of the actual hardware would be a dream. Ideally the Java VM would have a full set of vector operators, and would either emulate the operation in software or use the hardware processor if it was available - we'd still have "write once, run anywhere", except that if you're running on a machine with a decent vector unit you'll run a hell of a lot faster.