Boa noite!
É porque existem vários níveis de erro, no caso de índice inexistente é um erro de nível menor do que uma divisão por zero.
Ou seja, existem erros que aparecem como Runtime, Warning, Notice, etc...
Já erros do tipo divisão por zero são fatais (geralmente), e esses tipos interrompem a execução completa do programa, já erros de falta de alguma variável ou índice geralmente não interrompem a execução da aplicação, e geram uma cascata de erros (dependendo do caso) até chegar ao fim da execução ou atingir um erro fatal.
A simplificação de que ambos ocorreram na execução, não considera os diversos tipos de erro que podem ocorrer durante o fluxo. Diferente de erros de sintaxe e parse que costumam ocorrer antes mesmo de iniciar a execução.
Tipos de erro
Inclusive você pode configurar quais erros deseja exibir, utilizando as constantes pré-definidas: https://www.php.net/manual/pt_BR/errorfunc.constants.php
isso é feito usando o php.ini ou o error_reporting: https://www.php.net/manual/pt_BR/errorfunc.configuration.php#ini.error-reporting
Mas perceba uma coisa, colei abaixo a lista de erros que podemos controlar a exibição, observe que podemos até ignorar qualquer erro, menos os do tipo fatal.
PS: Os valores dos erros (à esquerda) é a representação deles em inteiro, perceba que crescem de 2 em 2, para possibilitar o uso de operadores bitwise, como ~E_ALL, onde no caso o operador é o ~. https://www.php.net/manual/en/language.operators.bitwise.php
Segue uma explicação detalhada sobre bitwise e o uso em PHP: https://www.youtube.com/watch?v=UQ5L-eoBV6Q