Eu passei o ano inteiro usando Rust. Eu vim do JavaScript (e já passei por diversas linguagens como Golang, Java e um pouquinho de C++ e C).
Eu discordo sobre a sua afirmação sobre Rust não ser adequado para Web... Um servido Web é literalmente o exercício final do Livro do Rust, reforçando a sua presença nesse ecossistema.
Sobre WEB
Claro que, não há muitos servidores web que precisam de Rust. A maioria dos casos um go já resolve. Um exemplo seria web server de redes sociais que requerem alta concorrência e performance. O ecossistema Rust entrega isso.
Sobre CLI
Sobre criar CLI, é, novamente recomendado no site oficial do Rust! E sim, Rust é muito bom nisso. Você pode fazer com JavaScritpt ou seja lá qual linguagem. Quando se utiliza Rust para CLI, não é para coisas simples. Infelizmente estão utilizando para coisas banais (o que não é pecado, mas o ganho em relação a outras linguagens é mínimo). Eu mesmo já criei alguns CLI para aprender a linguagem e uso pessoal.
Sobre as crates supostamente inúteis:
Bem, você não disse que são inúteis, mas como veio logo em seguida a um comentário sobre duplicação de crates, irei assumir que estava implícito.
textwrap formata texto de forma robusta, o que é essencial para formatação de logs, outputs em CLI, e coisas do tipo. Fazer isso manualmente é trabalhoso. Essa crate é uma mão na roda para quem realmente entende o seu proposito.
Trabalhar com Strings não é para amadores. Requer um trabalho cuidado para não ter bugs de lógica ou tornar a aplicação lenta por clone() em excesso(que não é necessário se você sabe o que tá fazendo ou se refinar bem a arquitetura da aplicação).
url manipulação de URL não é algo que possa ser feito de forma leviana e é necessário fazer de forma precisa. Isso incluí: formatar urls, obter segmentos da urls e coisas do tipo para processar corretamente. Fazer isso na mão pode (e com certeza vai em algum momento) criar um bug que pode lhe custar muito...
num_cpus essencial para quem usar Docker ou precisar fazer algum calculo matemático. Outro ponto é em tomada de decisões baseado no hardware da máquina. Portável para os sistemas operacionais mais populares (incluí outros ambientes como WASM).
postfix_assert útil se quiser um code style específico, mas nada grandioso.
É inevitável:
Até agora não encontrei nenhuma crate extremamente semelhante, mas isso é inevitável em QUALQUER ecossistema. Infelizmente sim, há crates inúteis, mas algumas realmente são simples, porém poderosas como o num_cpus.
Claro que não é perfeito:
Rust tem problemas sim, todo mundo tem, toda linguagem tem, e etc... Acontece que alguns são dramatizados. O borrow por exemplo, não achei nada tão complicado. É difícil de se adaptar rapidamente, mas não é nada tão dramático quanto fazem aparecer.
"ownership não funciona"
Ownership é apenas um CONCEITO para ilustrar como o borrow check se comporta. Não acho que o borrow check limita nada, apenas exige que você modele o problema diferente. As vezes é realmente um pé no saco e você só quer partir o teclado no meio, quando é especialmente algo simple , mas conforme você se acostumar com a linguagem é natural.
É apenas a minha opinião:
As comunidades são uma loucura em todo mundo. Se você fala bem demais algo você é defensor, se fala mal de algo é militante.
Eu gostaria de frisar que esta é a minha experiência com a linguagem. 1 ano usando não é muito tempo, mas já uma boa experiência. Esta pode não ser a sua, e tudo bem.