Come per richiesta dall'OP effettuerò il chip (senza rendermi ridicolo, spero: P)
Penso che siamo tutti d'accordo sul fatto che la ricorsione è solo un modo più elegante di codifica. Se fatto bene, può rendere il codice più gestibile, che è IMHO altrettanto importante (se non di più) che rasatura via 0,0001 ms.
Per quanto riguarda l'argomento secondo il quale JS non esegue l'ottimizzazione di Tail-call: non è più completamente vero, utilizzando la modalità rigorosa di ECMA5 abilita il TCO. Era qualcosa di cui non ero molto contento da un po 'di tempo fa, ma almeno ora so perché arguments.callee
genera errori in modalità rigorosa. Conosco il link sopra link a un bug report, ma il bug è impostato su WONTFIX. Inoltre, è in arrivo il TCO standard: ECMA6 (dicembre 2013).
Istintivamente, e aderendo alla natura funzionale di JS, direi che la ricorsione è lo stile di codifica più efficiente del 99,99% delle volte. Tuttavia, Florian Margaine ha ragione quando afferma che il collo di bottiglia rischia di essere trovato altrove. Se stai manipolando il DOM, probabilmente stai concentrando la tua attenzione sulla scrittura del tuo codice quanto più possibile manutenibile. L'API DOM è quella che è: lenta.
Penso che sia quasi impossibile offrire una risposta definitiva su quale sia l'opzione più veloce. Ultimamente, un sacco di jspref che ho visto mostrano che il motore V8 di Chrome è ridicolmente veloce in alcune attività, che gira 4x più lentamente su SpiderMonkey di FF e viceversa. I moderni motori JS sono dotati di tutti i trucchi per ottimizzare il codice. Non sono esperto, ma ritengo che V8, ad esempio, sia altamente ottimizzato per chiusure (e ricorsione), mentre il motore JScript di MS non lo è. SpiderMonkey spesso funziona meglio quando il DOM è coinvolto ...
In breve: direi quale tecnica sarà più performante, come sempre in JS, quasi impossibile da prevedere.