echo $begrüßung;
Ja, im HTTP-Kontext muss man das tun, aber das ist Aufgabe des Browsers, der dann diese URL vom HTML-Kontext in den HTTP-Kontext bringt.
Da könntest du auch sagen, im Query-String wäre es ebenfalls Aufgabe des Browsers - im HTML-Kontext ist urlencode nicht erforderlich, da reicht htmlspecialchars.
Die Aussage nach dem - stimmt soweit, nur übersiehst du dabei, dass wir uns an der Stelle noch nicht im HTML-Kontext sondern erst im URL-Kontext befinden. Im URL-Kontext haben Zeichen wie ?, #, / eine besondere Bedeutung, welche es gilt zu entschärfen, damit sie nicht als Sonderzeichen interpretiert werden, und das erreicht man mit htmlspecialchars() (&,",<,>) nicht.
urlencode() schießt hier sicherlich übers Ziel hinaus, weil es auch gleich noch alle Zeichen oberhalb von 127 kodiert. Das könnte in der Tat auch der Browser noch machen, wenn es für den Transport-Kontext erforderlich ist.
Ein Beispiel wie es gamacht werden soll, zeigt übrigens die Handbuchseite zu urlencode() (mal abgesehen davon, dass dort htmlentities() genommen wird wo ein htmlspecialchars() ausreicht).
echo "$verabschiedung $name";