Как вам нерекурсивный вариант, который базируется на регулярных выражениях?
var normalize=function normalize(htmlRoot){
if(!htmlRoot)
htmlRoot=document.documentElement;
htmlRoot.innerHTML=(htmlRoot.innerHTML+"").replace(/\b([ \t\n\r]){2,}\b/g,function(x,y){return y[0];}).replace(/[ \t\n\r]{2,}/g,"").replace(/>[ \t\n\r]*\b/g,">").replace(/\b[ \t\n\r]*</g,"<");
};
Первый реплейс делает пробелы между словами одиночными.
Второй - удаляет все остальные множественные пробелы.
Третий - удаляет пробелы после открытия тега.
Четвертый - перед закрытием.
Кстати, набор заменяемых символов можно подправить.