if op == OP_TAILCALL then
...
goto fallsto_call;
elseif op == OP_CALL then
fallsto_call:
...
end
Yes it's better (the compiler will manage itself to reorganize the jumps to implement fallsthrough it it wishes, depending on how it compiles the conditional jumps for if/elseif-tests which may contain "and/or" expressions that also frequently generate branches if there's no simple bitmasking expressions to reduce them without branches), just like it can swap branches if it helps it to use short relative jumps in less instructions, depending also on branch prediction (if the compiler has profiling data).
But for the source language, I still think that a switch is still simpler to read, even with a "fallthrough" comment (or directive for linters).
switch (op)
case OP_TAILCALL:
...
// fallthru
case OP_CALL:
...
And if we have a switch without break (all branches are breaking implicity, then yes we need a goto or a fallthru statement (not just a directive for linters or comment for programmers). Most programmers are aware of the syntax of switches, and they are usually cleander, faster to type; the only caveat is that fallthrough are traps which do not allow easy refactoring (e.g. adding cases, commenting out some of them: so an explicit fallthru statement is certainly better if it is labelled.