It is the "invisible" bit that bothers Joel. But of course nothing is invisible: there is a perfectly visible function call operator "()" right there, that he should assume an exception may bubble out of, and act accordingly.
I guess you could call exception an "invisible return", since it is not obvious that "foo()" may exit the current function. But "invisible return" sounds rather less nefarious than "invisible goto".
I like Rusts "foo()?" syntax which explicitly indicates that the function call may exit with an error.