Aunque tambien podria utilizar los JOIN
Lo que hiciste primero también es un JOIN
Vale, pero... ¿Entonces las foreign key no sirven para consultas?
¿solo sirve para los on delete y on update?
DELETE y UPDATE son consultas.
Como el ejemplo de sodark, si no usas foreign keys y eliminas un usuario, todos los mensajes y otros registros "relacionados" con el usuario quedarán intactos (digo "relacionados" porque la relación solo existiría en tu mente y no en la base de datos), haciendo que queden muchos registros huérfanos y en una base de datos grandes esto te volvería loco. Mejor aprender a hacer las cosas bien en lo pequeño.
Además podrías crear, por ejemplo, un mensaje asignado a un usuario que no existe y la base no se quejará.
Un foreign key también exige que la columna referenciada tenga un índice, lo que sí afecta al rendimiento de los SELECTs.