Я к тому, что это разные утилиты, с разным поведением и для разных целей.
sudo позволяет ТЕКУЩЕМУ пользователю выполнить операцию от имени другого пользователя. Не выполняя полностью последовательность входа в систему и все связанные с этим приседания.
su даёт возможность сменить контекст пользователя. Полностью. Это по сути новый вход в систему, с полной инициализацией всех подсистем. Например, мой скрипт для входа в контейнер с консоли запускает именно su, именно для того, чтобы ВНУТРИ контейнера получить рабочее окружение пользователя. Ибо окружение, из которого скрипт вызывается, остаётся… как бы это попроще сказать… снаружи.
eval $(inscreen -t "LXC:$*") 'sudo lxc-attach -n "${1:-dc1}" -- su -l "${@:2}"'
pkexec конкретно предназначен для исполнения рутовых операций, но в целом это по большей части демонстрация возможностей библиотеки polkit, и серьёзно нигде не используется.