Если нужно 2 эти операции делать в связке, то можно закрепить это поведение в самой БД через триггер, который после выполнения UPDATE сам инициирует необходимый INSERT. Логику insert-а (в вопросе уже готовые значения) пропишите в теле триггера (для Update возможен доступ к значениям до выполнения команды через псевдозапись (или как правильно в Maria они называются) OLD, к новым значениям - через псевдозапись NEW.
CREATE TRIGGER `update_users` AFTER UPDATE ON `users`
FOR EACH ROW
BEGIN
INSERT INTO payments(status_id, user_id, description, currency_id,
amount, bonus_amount, sum)
values('2' ,new.id, 'test', 643,
old.balance, old.balance+new.balance, new.balance);
END;
тут свои + и -.
+) БД управляет сама поведением записей (на случай, если кто 'забудет' прописать вторую команду или оформить транзакцию, или кто вручную добавляет данные из PhpMySQLAdmin и т.п.) согласно заданной логике.
-) Нужно хорошо знать БД (где и что она хранит и т.п. ;) )
Вопрос производительности не имеет однозначного ответа, так как зависит от многих факторов (ресурсы и текущая нагрузка сервера, частота изменений ...)