Você está usando /opt/kiosk.sh como seu arquivo de sessão para startx . Como esse script tem um loop infinito codificado, seu script reabrirá o navegador toda vez que for eliminado.
Em vez de usar while true , talvez seja melhor realizar uma verificação para verificar se esse serviço está sendo encerrado. Infelizmente, não estou familiarizado o suficiente com o upstart para saber qual condição de teste determinaria quando o sistema está sendo desligado. Algo como esse novo while loop pode ser suficiente (isso substitui o do script kiosk.sh ):
while [[ $(status kiosk) != */stopping* ]]
Esse loop espera o comando status kiosk retornar uma string contendo "/ stopping" e encerra o loop quando ocorre.
Espero que alguém com mais experiência em upstart possa corrigir minha implementação. :)