There are multiple ways you can do this in Cognito Forms.
You can use repeating sections to allow users to sign up for one or more events where they can click "Add Event" to add an unlimited set of additional events.
You can use conditional logic to conditionally show additional questions for a selected event. This could work both in conjunction with repeating sections or you could simply present a list of events and show fields (or blocks of questions) based on which events they select.
Regardless of your approach, if you enable payment via Stripe or PayPal for some of the events, the form will automatically collect payment only if the selected events result in a charge. Also, especially with the repeating section route, the receipt would be itemized and grouped by each event and selected options, such as an additional t-shirt fee or other add-ons.
Here is an example of what this could look like:
You can try out this example using the following shared template link:
https://www.cognitoforms.com/templates/shared/CognitoSupport/ZooEventRegistration
Follow up via comments if you have specific questions regarding how to put your form together or contact us through support!