WRT a browser plugin with LWJGL and a JVM - go for it but the existing integration as of JDK6_u10 is probably as good as it's going to get. If it's about a deployment size issue then unfortunately the license of the JDK means you'd have to ship the whole AWT anyway. If it's about reliability then... 6u10 is as reliable as need be and even then, previous versions are reasonably if not absolutely reliable. If it's about simplicity then... Display.setParent() is already very simple. All in all, feel free to develop such a plugin, but it is IMHO not really required any more. On the other hand, making a tiny JVM+LWJGL+some custom plugin against OpenJDK would be of interest to some.
Direct ByteBuffers are indeed the absolute fastest way to get data to OpenGL and in fact this is precisely why DBBs were invented. LWJGL is all about direct performance rather than convenience. Make your own wrapping/unwrapping if necessary; but more sensibly, just use DBBs - they are no more nor less convenient to use in general than array-backed buffers. And besides - you can
only use DBBs with mapped VBOs and certain older proprietry extensions.
If you want an OO API on top of OpenGL, you need to write one. OpenGL is simple imperative state machine API, and our remit was simply to expose that - we did at one point have a GL interface class so that LWJGL looked a bit like JOGL (indeed, you can implement JOGL in terms of LWJGL, but not the other way around). It is kind of pointless though. The static API as it is looks very nice indeed when combined with static imports from Java 5 onwards. But if you want to make an OOP wrapper on top - feel free but bear in mind it's a poor mapping from OOP to OpenGL's thread-local state machine. But our take on it is: we simply expose the bindings, it's up to you how you then put them into a framework or application.
The same reasoning is behind whether you support VBOs or not - it is the application developer's job to query capabilities of the driver and use features that they wish to use. We simply provide a safe failure mechanism (NPE calling non-existent methods) whereas in C land you'd get a native crash.
Cas

Some benchmarks:
Using the PJSDK(the sdk im currently working on for Java):
Creating a direct copy of a GC managed array(19583443 bytes) took: 8ms
NativeMemory.allocCopy(buff, 0, buff.length);
Allocating a direct array(19583443 bytes) and copying from a gc managed array took: 7ms
int nm = NativeMemory.allocate(buff.length, 0);
NativeMemory.setBytes(nm, buff, 0, buff.length);
1ms difference? not much
With the first solution i could easily modify the gc managed array, and just create a copy of it
With the second solution(what your saying is alot faster), if i wanted to modify it there would be that overhead for linking the native mutators/accessors, then there would be the actual performance of JNI etc.
So what would I go with if i was given a choice? the first solution of course.
Why would you need to program up a VM for java if you wanted to program an applet plugin..?
It was merely a suggestion, but if you would like to maintain the transparency then its understandable. If I were to develop a game and I was given a choice between JOGL or LWJGL(with the fallback mechanism i suggested) i would be in favor of LWJGL