Come da richiesta dell'OP, farò un chip (senza farmi ingannare, spero: P)
Penso che siamo tutti d'accordo sul fatto che la ricorsione sia 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 radersi 0,0001 ms.
Per quanto riguarda l'argomento secondo il quale JS non esegue l'ottimizzazione della coda, non è più del tutto vero, l' uso della modalità rigorosa di ECMA5 abilita il TCO. Era qualcosa di cui non ero molto felice qualche tempo fa, ma almeno ora so perché arguments.callee
genera errori in modalità rigorosa. Conosco il link sopra riportato a una segnalazione di bug, ma il bug è impostato su WONTFIX. Inoltre, sta arrivando il TCO standard: ECMA6 (dicembre 2013).
Istintivamente, e attenendosi alla natura funzionale di JS, direi che la ricorsione è lo stile di codifica più efficiente il 99,99% delle volte. Tuttavia, Florian Margaine ha ragione quando afferma che è probabile che il collo di bottiglia si trovi altrove. Se stai manipolando il DOM, probabilmente ti stai concentrando sulla scrittura del codice nel modo più gestibile possibile. L'API DOM è quella che è: lenta.
Penso che sia quasi impossibile offrire una risposta definitiva su quale sia l'opzione più veloce. Ultimamente, molti jspref che ho visto mostrano che il motore V8 di Chrome è incredibilmente veloce in alcune attività, che funzionano 4 volte più lentamente su SpiderMonkey di FF e viceversa. I moderni motori JS hanno ogni sorta di asso nella manica per ottimizzare il tuo codice. Non sono un esperto, ma credo che V8, ad esempio, sia altamente ottimizzato per le chiusure (e la ricorsione), mentre il motore JScript di MS non lo è. SpiderMonkey si comporta spesso meglio quando è coinvolto il DOM ...
In breve: direi quale tecnica più performante è, come sempre in JS, quasi impossibile da prevedere.