Правильно ли я использую исключения?
Нужно сделать отдельное исключение NotEnoughBonusesException и бросать его, остальные логировать.try {
}
catch (App\Exception\NotEnoughBonusesException $e) {
      $transaction->rollBack();
      Yii::$app->session->setFlash('error',  'Недостаточно бонусов для оплаты.');
}
catch (\Throwable $e) {
     Yii::$app->session->setFlash('error',  'Произошла ошибка.');
     $transaction->rollBack();

    // Нужно бросить исключение дальше, чтобы обработчик по уполчанию его занес в лог
    // Надеюсь в Yii есть обработчик по умполчанию?
    throw $e;
}
Также вам следует создать базовый класс для всех исключений вашего приложения, а не использовать \Exception.
Если вы хотите передать сообщение для пользователя вместе с исключением, создайте интерфейс UserFriendlyExceptionInterface с методами setUserMessage/getUserMessage и используйте их для отправки сообщения об ошибке пользователю:try {
} catch (App\Exception\UserFriendlyExceptionInterface $e) {
    Yii::$app->session->setFlash('error',  $e->getUserMessage());

    throw $e; // Передаем дальше для логирования
}
Как правило, исключения должны срабатывать в тех ситуациях, когда не возможно вернуть user friendly ответ пользователю. Все исключения должны писаться в логи, и не должны выводиться на экран (в production-режиме). Вы же как я понимаю, хотите вывести пользователю статусное сообщение. Так что нет - в вашем случае исключения не к месту.