Terminé de escribir la pregunta cuando me llegó la respuesta, ¡así que publique de todos modos para compartir conocimientos!
Me di cuenta de que el valor de retorno de la función metaphone era UTF8.
La comparación con un campo latin1 obviamente estaba incurriendo en una sobrecarga de rendimiento bastante alta.
Reemplacé la asignación de variables con:
SET @metaphone_val:= CONVERT(double_metaphone(p_parameter) USING latin1);
Ahora la consulta se ejecuta tan rápido como cabría esperar.