As far as I understand, Bitcoin is programmable, just not Turing complete.
Correct.
But what's the point of Turing completeness if the gas limits everything already?
Concept of gas limits isn't exist on Bitcoin. Although there are few similar limitation such as maximum script size, stack size limit and operation limit.
Why not just repeat the statement in code? Or "Goto" and "Label"?
goto usually is considered bad practice, unless we're talking about low level programming such as assembly. And i'm not sure if it's possible to implement
goto/
label on Bitcoin script which is categorized as stack-based programming language.