if (obj.error) return -1; явно лишняя. Можно передать управление нелокально. Но если супирь-пупирь производительность нужна, тогда может быть.
дело не в производительности, а в читаемости. Если функция не должна ничего делать, она должна ничего не делать (просто return). А вот прыгать куда-то в конец — это костыль и не нужно. Разве что для быдлокодеров, у которых 100% кода работает только после пошаговой отладки такое удобно, ибо туда можно break-point ставить, на выход, который один. Других плюсов в C++ я не вижу.
И да, исключение — это на самом деле тоже такой return, что-бы прыгать из глубины функции наружу. Просто обычный return прыгает на один уровень, а исключение — на нужное количество. И тем не менее, ВСЕ локальные деструкторы срабатывают так, как будто там return за return'ом забиты (в машинном коде так оно и есть обычно).