I have found no hard and fast rule about the perfomance hit from a loop vs an @ command.
Each case needs to be tested. For complex conditional statements the @ must suffer vs the the loop, but the loop brings an overhead that the @ does not have.
In many missions the difference will be hard to spot, but in large missions where there may be many such commads running at the same time then you should test which is better. For example I know that:
@ (getdammage _unit >0.9)
is much better than:
#loop
~0.5
if (getdammage _unit <0.9) then {goto"loop"}
Because I tested it with 5,000 scripts all running smultaneously.