Hi
I don't know whether it is already supported in LibGDX but if it isn't, let me help you out. I have a similar problem in my first person shooter. The first level uses a museum with some soldiers but the second one uses a completely different environment.
An easy step consists in keeping no reference on these meshes (and maybe on their textures too) so that the garbage collector can do its job with Java objects on the Java heap.
Another (less) easy step consists in releasing OpenGL resources (mainly the identifiers), by calling glDeleteBuffers for all VBO identifiers and by doing something similar with textures.
The hardest and less safe step consists in releasing the native memory on the native heap, typically used by direct NIO buffers. You can find tons of examples on Internet to "destroy" direct NIO byte buffers by using their cleaners. However, if LibGDX doesn't create them by using allocateDirect(), it won't work. You will need to treat the viewed buffers differently. If you use a direct NIO buffer after releasing its native memory, you will get an access violation error

Lots of 3D engines and APIs use asFloatBuffer(), you can't retrieve the cleaner so easily in this case, you need to make some supposition on how they are implemented, you have to get the real direct NIO byte buffer contained by this fake float buffer and then you can use the cleaner as usual.
@davedes feel free to make a better suggestion
Edit.: You have to ensure the backend you use (based on JogAmp or on its competitor) do not keep references on deleted buffers (typically after calling glDeleteBuffers) or you may have some big problems.