Pretty sure zig has safe integer operations: integers aren't allowed to overflow with the standard operators, there are overflowing and saturating operators if that's what you want.
Rust and D and probably others have this too. The interesting question is:
Can you chain these operations in a way that will propagate the error to the end result while simultaneously have a compiler produce code without branches after every operation. Safe integer operations alone are not enough for that.
I think the operators panic. In zig, If you want safe operations I think there are functions in the stdlib
The branching does not cost as much as you think, I'm pretty sure the compiler marks the erroring path as cold, which the cpu can use to elide most of the branch cost through specex
Setting an fp sticky flag is 15 cycles in x86. So if integer modes have similar latencies and you have a hot function with two different integer modalities then speculative branching is almost always going to be faster.