ainda que nas linguagens mais modernas costume ser irrelevante
Eu acho que a relevância é, digamos, indireta.
Apesar da maioria das linguagens modernas não permitirem usar ponteiros diretamente, o estudo deles em C permite entender melhor o conceito de referências, que muitas ainda possuem.
Embora nem todas permitam manipular diretamente as referências, ainda sim ajuda a entender certos comportamentos. Um exemplo clássico em Python:
def f(x):
x += 10
def g(x):
x += [ 10 ]
n = 1
f(n)
print(n) # 1
n = [ 1, 2, 3 ]
g(n)
print(n) # [ 1, 2, 3, 10 ]
O número não é modificado pela função, mas a lista sim. Isso porque o primeiro é um tipo por valor, e o segundo por referência.
Apesar de Python não permitir manipulação direta das referências, vc precisa saber o conceito para entender porque em um caso o valor não é alterado e no outro é. E - na minha opinião - estudar C é uma ótima maneira de aprender este conceito, pois vc tem que fazer tudo manualmente via ponteiros.
Algumas linguagens, como C#, permitem escolher se um argumento será passado por valor ou referência, sem precisar de manipulação direta dos ponteiros. Já outras, como Python, JavaScript e Java, não permitem tal controle, pois é o tipo que indica como será passado.
De qualquer forma, estudando C vc entende melhor o que está por trás desses mecanismos e fica mais fácil pra entender outras linguagens - até porque todas usam alguma variação do que já foi citado, mudando um detalhe ou outro.
Por essas e outras que muitos - eu incluso - defendem o uso de C como ferramenta de aprendizado, mesmo que nunca vá trabalhar com ela.
Todas as linguagens que eu conheço permitem passar qualquer valor por referência, mas algumas, como as três citadas citadas, que não possuem nem ponteiro, nem referência, só permitem encapsulando o objeto a ser passado por referência em outro objeto que já é por referência naturalmente, como bem demonstrado no exemplo acima. Só não daria para fazer isso em uma linguagem de programação que não tem referência alguma, ou não permita colocar qualquer objeto dentro de outro por referência.
Embora dê para estudar todas as estruturas de dados e algoritmos em todas as linguagens, não da forma como ela funciona de fato, teria que fazer um contorno, e dificulta entender o que de fato está acontecendo. Continuaria parecendo mágica. Por isso C é interessante, e simples. C++ e Rust também dão, mas são complicadas.
Farei algo que muitos pedem para aprender a programar corretamente, gratuitamente. Para saber quando, me segue nas suas plataformas preferidas. Quase não as uso, não terá infindas notificações (links aqui).