> Does Zig offer (guaranteed) tail call optimisation?
Yes[1]. You can use the @call builtin with the .always_tail modifier.
@call(.always_tail, foo, { arg1, arg2, ... });