There's minetest which has gotten a lot better over the years:
http://www.minetest.net/
There are *tons* of issues with Minecraft... that Mojang has no intention of fixing. Here's some obvious ones...
1) Use of TCP. Might not be bad with a few clients. But on a server with hundreds of players, TCP sockets are incredibly inefficient on both bandwidth and system resources. I won't get into why that is... but generally any real-time packet that doesn't need to be reliable should be done using UDP packets.
2) Bad protocol. Packets should be serialized. Because they're are serialized, we know they're always in a specific format. We can predetermine things like strings inside of a packet by parsing the header of a packet, then parsing another integer (usually 2 or 4 bytes) that determines the size of the string, then parsing the string. If there are multiple strings, you have multiple integers that sit next to each other so we can parse the serialized sizes at once. In the case of Minecraft, we parse the header... then we have this weird variable sized integer that we have to take resources to compute the size of. Then we parse the string. If there are multiple strings... we have to parse each string one at a time since the integer is at the beginning of each string rather than at the beginning of the packet. I can go on and on about how bad this is in real-time networking but I'm just going to move on...
3) Liberal usage of Memory. It's not always so true what people say about Java. It can be a memory hog... but it's generally the user that causes the problems. "I can allocate whatever I want and Java will clean up after me". This is not a good mindset and leads to problems like a 2 man Minecraft server crashing with out of memory exceptions on a 1GB VPS dedicated to that Minecraft server.
4) Retarded Code Obfuscation. Mojang went well out of their way to obfuscate their code. They still do to this day. Yet, if it weren't for the community reverse engineering their code, Minecraft would probably not be much of a thing today.
And these are issues that can be addressed without even moving to C++. A new language doesn't fix the programmer.