Na tak prostym kodzie faktycznie, użycie tego ifa może być lekko "brzydsze", ale robi to samo i może nawet prościej. Choć kłóciłbym się o to, co zwraca funkcja podziel w drugim kodzie - stringa czy liczbę? Powinien być zadeklarowany typ zwracany gdy to możliwe, mamy PHP7 od dawna. Gdybyś nie robił echo podziel() tylko chciałbyś dalej to np. dodać to co? Musiałbyś sprawdzić czy tam jest string (zwrócony błąd) czy liczba którą można dodać. Niezbyt wygodne.
Znasz trochę OOP i MVC? Mam nadzieję że tak, to będzie łatwiej. Załóżmy tak: masz aplikację i prosty schemat: uruchamia się kontroler użytkowników, który wywołuje jakąś klasę nazwaną ogólnie serwisem użytkowników, a ten serwis ma metodę tworzącą i zwracającą nowego użytkownika. Masz też piękną podstronę z błędem 500, który trzeba pokazać jak coś się wysypie oraz dodatkowo zalogować dokładny błąd do logów systemu. Teraz zagadka: jak obsłużyć błąd, który wydarzy się w serwisie podczas tworzenia użytkownika? Widoki zwraca przecież kontroler, z serwisu nie ma jak. Zwrócić null/string z błędem z metody tworzącej użytkownika? No nie możemy bo metoda ma zwracać model użytkownika, nawet jakby nie zadeklarować typu zwracanego to bez sensu przecież. Zrobić w serwisie echo 'błąd'; exit();? Paskudne, jak mówiłem strona musi zwracać cały konkretny widok z błędem 500 a i jeszcze zalogować ten błąd! W każdym miejscu gdzie może się coś stać musiałbyś więc przeklejać kod generowania podstrony i logowania błędu.
Tu z pomocą przychodzą wyjątki. Rzucasz sobie taki w serwisie. Przy dobrze napisanym kodzie wystarczy zrobić tak, że w jednym miejscu złapiesz wszystkie wyjątki i raz napiszesz tam kod wyświetlający podstronę błędu czy logowanie treści błędu do logów. Co więcej, można tworzyć własne klasy wyjątków, co daje możliwość różnych reakcji na różne błędy i łapania ich w odpowiednich miejscach, w zależności od potrzeb. Każdy wyjątek może mieć też swój kod błędu, dodatkowo możesz z niego odczytać plik w jakim został rzucony wyjątek, linię w kodzie, trace (ścieżkę, jakie klasy po kolei co wywoływały dochodząc do tego błędu). Rzucenie wyjątku przerywa dalsze wykonywanie kodu, czyli np. to co masz dalej w metodzie już się nie wykona, nie trzeba żadnych warunków. Do tego jeszcze wyjątki są przecież klasą, można więc we własnym typie np. nadpisać konstruktor czy dodać metodę i wstawić tam własną potrzebną logikę (nie szalałbym tu za bardzo z jej ilością, ale choćby dostosowanie komunikatu błędu bez problemu).
Mam nadzieję, że trochę rozjaśniłem - na przykładzie tego typu chyba najprościej wytłumaczyć.