I've used Excelsior, a few years back. In my experience it does what it says on the tin. I believe the newer versions are not only certified as Java-compliant (passed the TCK) but also offer downloads that are smaller than the equivalent JRE.
I didn't want any dynamic compilation at runtime (= greater download size), so it was necessary to know in advance all the classes that were used at runtime. This is similar to the problem of using an obfuscator - classes loaded via reflection will not be discovered by static analysis. IIRC, a tool is provided with the compiler that writes to file all the classes loaded at runtime which can then be used to define the classes that are compiled into native code. We made a test plan that executes all features of the app to ensure all classes were loaded.
Would I recommend it? Possibly, it depends upon why you want it. My use case was that I wanted to avoid users having to download a JRE. Now that most installers come with the ability to automate/assist with obtaining a JRE, I see there is less of a need, so we stopped using Excelsior.