John,
I have not done any testing but make my assumptions based on past observations & my poor memory of those observations.
I think WHILE is faster than mapcar, foreach, or repeat.
I think the overhead of a recursive function makes it slower in general.
I think the overhead of calling a function also is slower than making the operation local within a function. It may take more code but I thought it would be faster.
So my vote is for version 1 to be the fastest.