Buenas,
como ya se ha dicho para HTML todo son cadenas pero en el caso de los manejadores de eventos son cadenas de javascript, (así que me queda la duda de que no se use eval), el intérprete cuando se carga la página crea una función anónima con el contenido del atributo del evento. Se puede comprobar así:
Código HTML:
Ver original<a href="#" id="cadena" onclick="alert(typeof this.onclick); alert(typeof this.id);">aqui
</a>
Casi diría que si que usa eval porque he probado a quitar las comillas del atributo onclick y daba error de sintaxis y eval si lo que recibe como argumento no es una cadena primitiva no intenta convertirlo y da error.
Una cosa que no se ha dicho es que las funciones se ejecutan en el ámbito que se definen y si se definen como atributo el ámbito es distinto. Por eso a veces puede no ser exactamente lo mismo que si se hace en un archivo diferente, cuanto menos código haya en el atributo mejor, porque la función anonima que se crea con el valor del atributo tiene un ámbito mas complejo y si no se tiene cuidado puede causar problemas al redefinir metodos por error o poder recorrer el arbol, por ejemplo.
Otra cosa que también se ha comentado es que al hacerlo como atributo habría que asignarlo a cada elemento en el documento html con lo que resulta más tedioso cualquier cambio en el código. Pero además los atributos no se pueden modificar, sólo se puede modificar la propiedad del objeto element del DOM con lo que si necesitáramos modificarlo dinamicamente como atributo no podríamos y al redefinir la propiedad anularíamos el posible valor que tuviera el atributo.