Respecto a Java, pues es un lenguaje que está quedando un poco arcaico. Le faltan cosas tan básicas como propiedades, closures, personalmente también le pondría tipado implícito,... En relación a la mención que se ha hecho a C#, mi opinión es que lo que pudo haber sido Java, hoy en día es C#.
C# es un lenguaje muy completo y, como tu has dicho, tiene muchas plataformas que ofrecen cantidad de facilidades al programador a la hora de hacer el desarrollo más sencillo, sin comprometer tanto la velocidad. Respecto a XNA, pues la verdad que lo probé y no me acabó de gustar, supongo que porque no le dediqué el tiempo suficiente, pero si sabes de algún tutorial que me abra los ojos, lo recibiré con ganas y le intentaré abrir un hueco

.
La pega, pues la de siempre, que todo su ecosistema está enfocado a los sistemas Windows en específico. Además, a Mono parece que poca gente lo acepta, incluso se le critica por eficiencia, aunque la mayor parte de críticas vienen de que al fin y al cabo comparten la plataforma con Microsoft. Al final, la elección de una plataforma u otra, creo que queda totalmente condicionada primero por el destino que quieras conseguir con tu desarrollo, y al final por preferencias personales.
A mi parecer, Java no morirá en mucho tiempo, y pienso que para plataformas tan emergentes como Android, donde Java ocupa un lugar central, seguirá siendo interesante su uso. Y C++, lo mismo, para juegos de PC y consolas seguirá siendo necesario por cuestiones de que cosas que se pueden hacer en C++ a nivel de eficiencia son imposibles en los lenguajes más modernos.