Well, Lua has "labels" but the "break" statement cannot be used to break several loops (for, repeat, while), even if these loops are labelled, we still cannot simply use "break label_name" (which would not be a goto as it should go just *after* the loop and not just before...
We can use a trick: define a function containing the loops, and returning from the function instead of breaking. But using an extra function does not play well. So we're left using ugly "goto" statements by adding an extra label just after the loop (possibly with a colon to create an empty statement). It should be better/cleaner to label the loop statement itself.
As well the absence of a "switch" statement forces us to use multiple "elseif" clauses causing the same _expression_ to be evaluated multiple times, or to declare a local variable, which should be implicit; but then the local variable persists in scope after the "if...elseif... else... end" block, and if should be desirable to reduce its scope, so we have to use a dummy "do...end" block to enclose the "local" variable declaration and initialization and the "if...end" statement. This does not make the code really cleaner and does not simplify the compilation to optimize these ifs (e.g. using a jump lookup vector) without analysing each _expression_ given in "if..." and all "elseif..." clauses, to find if they test the same value and compare them possibly with "or"/"and" subexpressions. This is much work for the compiler that would be avoided using a simple switch comparing the tested _expression_ with a list of distinct constants (evaluated at compile time)...