Hay una gran diferencia de performance entre usar INNER JOIN y usar el WHERE. Te imaginas que si fuera la misma, el INNER JOIN no tendría razones para existir y ser la cláusula más usada.
Por empezar, el WHERE actúa recién sobre los registros obtenidos en el FROM, pero
todos, lo que implica que se lee todo, incluso registros que son innecesarios. Esa lectura excesiva implica accesos a disco, bloques de memoria, swapping de disco, tiempo de proceso...
.
En cambio, el filtrado de un INNER JOIN ocurre en el momento en que se leen los bloques de datos: se descarta lo que no cumpla la condición, por lo que el resultado de lectura (dependiendo de algunos factores) es forzosamente de menor uso de recursos.