1. Это абсолютно нормальный подход.
2. Если вызов проги - последнее действие скрипта, то лучше делать не подпроцесс, а замещать текущий процесс прогой, что экономит немного памяти и сохраняет отношения parent-child для сигналов (т.е. после отработки скрипта родительская прога получит абсолютно такое же состояние дочернего процесса, как и до подмены проги на скрипт):
#!/bin/sh
# некоторые действия:
# обработка входных параметров,
# установка дополнительных переменных окружения,
# и т.д. ...
exec path_to_dir/progX_orig $*
3. Параметры в прогу лучше передавать так, как они были переданы в скрипт, а конструкция $* произведёт репарсинг аргументов.
Т.е. последняя строчка, с учётом п.2, на мой взгляд, должна выглядеть так
exec path_to_dir/progX_orig "$@"