Limpei os arquivos ifcfg criados pela mídia de instalação do CentOS e usei o nmcli para criá-los do zero. O antigo e novo arquivo ifcfg acabou sendo quase exatamente o mesmo. As diferenças são a ordem do conteúdo, um novo UID gerado automaticamente e eu dei à conexão um nome personalizado de ext0 em vez de ser gerado. E agora funciona perfeitamente bem.
Então, no final, quem diabos sabe. O emoticon flip desk seria útil aqui.
Pelo que descobri, o NetworkManager separa completamente o dispositivo e a conexão. No meu caso, a cada hora, por algum motivo, o NetworkManager determinou que a eth0 não estava configurada apesar de ser assim e geraria uma nova conexão temporária que falharia. Portanto, soltando a conexão atual completamente, sem a temporária, e repita.
Talvez qualquer um desses dois itens sejam referências em outro lugar que eu não conheça, portanto, informar o NetworkManager de fato está em uso e controlado pelo NetworkManager (NM_CONTROLLED = yes não fez nada, para o registro).
No final, este é o meu ifcfg-ext0:
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=yes
NAME=ext0 # Arbitrary name given
UUID=<UUID generated by NetworkManager>
DEVICE=eth0
ONBOOT=yes
ZONE=drop
DNS1=<IPv4 DNS server>
DNS2=<IPv4 DNS server>
IPADDR=<static IPv4address>
PREFIX=24
GATEWAY=<static IPv4 gateway>
DOMAIN=<my domain>
DNS3=<IPv6 DNS server>
DNS4=<IPv6 DNS server>
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_PRIVACY=no