Gridmap can work. The models in the Gridmap don't have to be cubes. They can be any size, as long as they can fit in a cube. So you can make a few different variations. One that is all dirt and fills the cube. A one for below that is half dirt, half rock. A dirt grass one for above. However, you will need a LOT of variations to get the image you posted, but it is possible.
The other option would be to do it procedurally (like Minecraft). You can generate model the meshes or even generate them with code (MeshDataTool) and then place them like normal MeshInstances. This would not be as fast as Gridmap, and would require a lot more code, but it would be more flexible and you could get the exact look from the image.