Cita: Tengo entendido que la razon por la cual exiten lenguajes de alto nivel es para que su sintaxis se acerque a la sintaxis de los lenguajes humanos.
opino diferente. en el sentido mas general del termino
alto nivel, significa el nivel de abstraccion de un lenguaje con el hardware que lo soporta. en otras palabras se refiere a la posibilidad de portabilidad de un lenguaje a diferentes equipos y/o sistemas operativos. por tanto, no creo que la sintaxis del lenguaje tenga alguna relacion con el nivel de abstraccion. mirate por ejemplo Objective Caml es un lenguaje de alto nivel y su sintaxis es bien distinta a la de javascirpt.
respecto a tu primer y segundo punto, sucede que el DOM va evolucionando. la diferencia del primer y segundo ejemplo es el modelo que se emplea aunque parezcan realizar lo mismo. sin embargo, en el caso de addEventListener tienes un control que con DOM Level 0 (onclick, onmouseover, onmouseout, onkeyup, etc...) no tienes. definir en que fase capturar el evento: bubble o capture. por otro lado, y mas importante aun, addEventListener te permite definir eventos que no existen en DOM Level 0. probablemente lo que se te quiso explicar (en la literatura que probablmente estas leyendo) son dos modos en que se lograr separar los script de los elementos.
el tercer punto. realmente las propiedades no son variables, simplemente es una entidad que esta ligado a un objeto. en cambio, una variable es una memoria que almacena un valor temporalmente o permanentemente. por supuesto, mientras la aplicacion este activo. ahora bien, en javascript, hasta cierto punto ese principio se puede torcer pero esto se debe a las caracterisitcas del propio lenguaje. en javascript, si una variable se define como global, esta pasa a ser una propiedad del objeto window. pero cuando es una variable local de una funcion, es simplemente una variable temporera que se destruye (si no ocurre un closure) cuando la funcion termina la ejecucion.
respecto a document ser un array, pues no lo es pese a la sintaxis que demuestra parecerlo. lo que sucede que javascript te permite dos formas de acceso a las propiedades: por el operador punto (.), y por corchetes ([]). ambas son igual de validas. la diferencia es lo que puedes lograr hacer con una que de lo contrario es imposible. en la de corchete tu puedes escribir practicamente cualquier expresion que evalue a un nombre de la propiedad. incluso, este nombre puede ser compuesto por caracteres que no son legales para los identificadores.
cuarto punto. lo has interpretado bien, se verifica si dicha funcion existe antes de utilizarla. como te explique antes, addEventListener define otros eventos que no existen en el modelo DOM Level 0. desgraciadamente iexplorer es un navegador que no tiene soporte para el modelo DOM Event Level 2.
y finalmente, ¿cual utilizar? en mi opinion puedes utilizar con el que te sientas mas comodo. ambos son validos, solo que si utilizas addEventListener tambien tienes que considerar el equivalente de iexplorer: attachEvent. y hasta donde mi conocimiento alcanza, attachEvent solo tiene soporte para los eventos DOM Level 0.