Los shells no reorganizan el código que reciben, solo se interpreta una línea tras otra (nada más tiene sentido en un intérprete de comandos). Gran parte del tiempo dedicado por el shell se destina al análisis léxico / análisis / lanzamiento de los programas llamados.
Para operaciones simples (como las que combinan cadenas en los ejemplos al final de la pregunta), me sorprendería si el momento de cargar los programas no abruma las diferencias de velocidad minúsculas.
La moraleja de la historia es que si realmente necesita más velocidad, es mejor usar un lenguaje (semi) compilado como Perl o Python, que es más rápido para comenzar, en el que puede escribir muchas de las operaciones mencionadas directamente y no tiene que llamar a programas externos, y tiene la opción de invocar programas externos o llamar a módulos C (o lo que sea) optimizados para hacer gran parte del trabajo. Esa es la razón por la cual en Fedora el "azúcar de administración del sistema" (esencialmente las GUI) están escritas en Python: puede agregar una buena GUI sin demasiado esfuerzo, lo suficientemente rápido para tales aplicaciones, tener acceso directo a las llamadas del sistema. Si eso no es suficiente velocidad, toma C ++ o C.
Pero no vaya allí, a menos que pueda demostrar que la ganancia de rendimiento vale la pérdida de flexibilidad y tiempo de desarrollo. Los scripts de Shell no son demasiado malos para leer, pero me estremezco cuando recuerdo algunos scripts utilizados para instalar Ultrix que una vez intenté descifrar. Me di por vencido, se había aplicado demasiada "optimización de script de shell".