This compilicates things more compared to functions returning Result<>.
You also get locality benefits from bump style allocators. And you don't need SmallVec or similar optimization containers. And you also avoid mental overhead of managing many allocations in your head (or using a language with borrow checking).
> This compilicates things more compared to functions returning Result<>.
Checking each Result in a large program is more complicated than having a runtime library handling memory limits properly.
> And you also avoid mental overhead of managing many allocations in your head
That's exactly what languages like Zig force you to do, compared to something like C++ or Rust.
> or using a language with borrow checking
borrow checking gives memory safety. It's also important to have.