"Dynamic" cave creation?

Your method using modular cave chunks should actually work well. As long as you use the same static mesh for each piece then the entire cave can be rendered in a single draw call (just as if it was a single mesh) with a significant saving on vertex data that needs to be stored in memory.