One solution that is used in voxel-based engines is to compact zones of blocks into bigger block-zones, thus reducing the draw calls.
Let's take a 10x10x10 cube full10x1x10 surface of blocks. The engine compacts itYou could compact this into 1 single cubecube instance and drawing will only be called oncesend that information to the gpu, instead of sending 100 block's info.
Of course you'd need to loop the textures instead of resizing them, and you may bump into other problems, but I'll let you expand on that idea by yourself.