best practice for query string values – get_query_var always empty for my value supplied in query string

You get the exact unchanged value with:

$event_id = filter_input( INPUT_GET, 'event_post_id', FILTER_VALIDATE_INT );

Here I added the validation filter directly, but you can even move that to separate code for more complex cases.

WordPress’ query variable handling is for cases in which you want to allow changes to the values before they reach your code.

“Best practice” is quite a loaded expression, that’s why we often shy away from that label. 🙂
Write code you and someone else (=future you) can maintain and understand.

If there is a fast and readable PHP way, use that. filter_input() gives you the variable as sent by the client, and no matter what WP does, it will always stay the same. The super globals $_GET, $_POST and so on are writable, you can’t trust them.