The best way is to define independent workflows. Soe of the explanation below will hold true if you are on Adobe Campaign Classic.
1. Create a Campaign
2. Develop the first workflow which targets people 30 days before the event. This workflow should have a scheduler which runs it every day.
3. Develop the second workflow to target people 14 days before the event. Should have a scheduler to run every day
4. Third workflow to target event ticket holder one day before the event. Should have a scheduler to run every day
5. Develop final workflow to target the attendees one day after the event. Scheduler to run every day.
You can add resilience to these workflows by maintaining an OPTION per workflow, storing the date when a particular workflow ran successfully. Imagine one of these workflows failed on Saturday morning. Your team found it out on Monday and if you restart the workflow it will not target people who were supposed to be contacted on Saturday and Sunday.
If you store the last successful date, On Monday it will pull all eligible people included from Saturday, Sunday and Monday. Please design your logic carefully.
I'm guessing you will have many to many link between Event and Recipient. So start all your queries from Event and then change the dimension to Recipient.