These were also my first thoughts.
Using of hook location is more "elegant" than direct code modification.

But in this case, I thinks it's not the fastest solution.
I tried to get the custom field with
PHP Code:
$vbulletin->db->query_first('SELECT `field5` AS realname FROM `'.TABLE_PREFIX.'userfield` AS uf LEFT JOIN `'.TABLE_PREFIX.'user` AS u ON u.`userid` = uf.`userid` WHERE u.`userid` = ' . $touser['userid'])
but its pretty slow.
Also I can't simply str_replace the username in the template with the fetched custom field because the template will be rendered after the hook location .
So I have to use the loaded template in array $evalemail[$touser['languageid']] and write back my changes...