Close funktioniert bei Modalen, und auch teilweise bei Nicht-Modalen.
[edit] siehe #7 und #6
Bei Modalem macht es einfach nur
ModalResult := mrCancel;
, also funktional kein Unterschied zu deinem Lösungsvorschlag.
OnClose und OnyCloseQuery wird bei Dialogen (modalen Forms) aber sowieso niemals aufgerufen. (ja, das ist IMHO ein Bug, aber der ist schon seit 20 Jahren so, also weigert sich wer das zu reparieren)
Natürlich schließt Close beim Modaten das Fenster niemals sofort, sondern erst wenn ShowModal verlassen wird, also nichts die MessageLoop darin blockiert (z.B. ein Sleep oder eine Schleife im Event).
Free würde es sofort schließen, daber das benutzt man hier NIEMALS, denn wenn doch, dann knallt es anschließend.