Os shells não fazem qualquer reorganização do código que recebem, ele é interpretado apenas uma linha após a outra (nada mais faz sentido em um interpretador de comandos). A maior parte do tempo gasto pelo shell vai para a análise lexical / parsing / launching dos programas chamados.
Para operações simples (como as que entopem strings nos exemplos no final da pergunta) eu ficaria surpreso se o tempo para carregar os programas não inundar quaisquer diferenças minúsculas de velocidade.
A moral da história é que, se você realmente precisa de mais velocidade, é melhor ter uma linguagem (semi) compilada como Perl ou Python, que é mais rápida de executar para começar, na qual você pode escrever muitos dos operações mencionadas diretamente e não precisam chamar programas externos, e tem a opção de invocar programas externos ou chamar módulos C (ou qualquer outro) otimizados para fazer a maior parte do trabalho. Essa é a razão pela qual no Fedora o "sistema de administração de açúcar" (GUIs, essencialmente) é escrito em Python: pode adicionar uma interface gráfica agradável com pouco esforço, rápido o suficiente para tais aplicações, ter acesso direto às chamadas do sistema. Se isso não for velocidade suficiente, pegue C ++ ou C.
Mas não vá até lá, a menos que você possa provar que o ganho de desempenho vale a perda de flexibilidade e o tempo de desenvolvimento. Scripts shell não são ruins para ler, mas eu estremeço quando lembro de alguns scripts usados para instalar o Ultrix que eu tentei decifrar. Eu desisti, muita "otimização de shell script" foi aplicada.