Segun he entendido, lo que te pasa es que no cambian las valores en el document.write pero si cambian en el alert.
Eso te pasa por una sencilla razón:
window.onload = function(), espera a que todo el documento este cargado antes de ejecutarse, mientras que los document.write que pones con las imágenes se ejecutan nada mas se carguen, por tanto, todavía no tienen los valores que se definen dentro de la función.
Yo lo que haría seria esto:
<div id="usercountpost">
<span id="valor">5</span></div>
<script type="text/javascript">
var expe=1;
var nivel=2;
window.onload = function (){
var mens=parseInt(document.getElementById('valor').innerText);
expe=parseInt(mens*1.6);
nivel=parseInt(expe/2);
document.getElementById('cantidad_nivel').innerHTML = nivel;
document.getElementById('cantidad_exp').innerHTML = expe;
alert('Mensajes: '+mens+' Exp: '+expe+' Nivel: '+nivel);
}
</script>
<img src="http://i226.photobucket.com/albums/dd257/RoxyHana/Lyslan_Foro/Iconos/5_zpse406282e.png"/>
<span id="cantidad_nivel"></span><br/>
<img src="http://i226.photobucket.com/albums/dd257/RoxyHana/Lyslan_Foro/Iconos/4_zpsaaad303d.png"/>
<span id="cantidad_exp"></span><br/>
Por otra parte necesito convertir esto en un bucle ya que tengo varios <span> con la misma id y necesito que haga lo mismo con todas...
HTML esta diseñado SOLO y ÚNICAMENTE para un ID por elemento. Varios ID te arruinan =). Utiliza class y el método
getElementsByClassName().
Saludos