hide old events custom post type

Your main issue is here is date formatting. Although the other answer will work, it is ineffecient and will cause inconsistant amount of posts per page in paginated queries. The issue here is, if you have 100 posts and only 10 has a date in future, you are wasting a lot of resources querying an extra 90 posts to just skip/hide them in the loop. Also, if you paginate the query, you might get pages with 5 or two or no posts at all at random. But I’m not here to crirtisize any other posts 😉

As I said, your main issue is date formatting. Unlike the date_query field, custom fields sorts and compare literally. What that means is, if you try to compare an apple with an orange as a fruit, the comparison will fail in a custom field as an orage and an apple is not the same thing, although they are both fruits, where in a date_query the comparison will pass as the logic is there that both are fruits regardless to which kind of fruit

time() returns the current time in unix timestamp. You can test this by simply doing echo time(); anywhere in a template. In a date_query, the logic is there which knows this is a valid unix timestamp. A meta_query sees this a literal number with no special meaning. In order to make sorting and comparison work, your date in a custom field must also be saved as unix timestamp in order for this format to work. Any other format will fail.

I believe that the dates in your custom field is saved as normal dates and not in unix timestamp, so the above will not work with time(). What you need is the date() function or similar functions in php to return the current time and date in the required format (Note, your date format saved in a custom field have to be Y-m-d H:i:s for comparison or sorting purposes, any other format will not work, period).

So, to solve your issue, if your date format is Y-m-d H:i:s or just Y-m-d, you only need to change the following line

$today = time();

to

$today = date( 'Y-m-d H:i:s' );

or

$today = date( 'Y-m-d' );

Apart from this, your code should work and only return posts after and including today

PS! wp_reset_query(); should be wp_reset_postdata(); 😉