You can get all these benefits and not have any of the downsides if you have something like Result or Either, which requires generics. You only really compare Go's solution against exceptions. That's not the only solution that exists.
case some_operation() do
{:ok, result} -> # do something with result
{:error, error} -> # handle the error
end