Specify job executions with only/except to enable different pipeline scenarios

I am trying to create a pipeline that needs to run a) when code is being pushed b) tagged c) scheduled d) per trigger (curl). Trying to use only/except specs as defined in https://docs.gitlab.com/ce/ci/yaml/README.html#only-and-except-simplified

One thing that is not clear to me from the docs is the difference between branches & tags vs pushes

I also noticed that if I set my job for scenario a+b to only: [branches, tags] it will get also get executed in scenario c+d which seems odd because I did not push any new commits. The only way to get this properly working is to also add except: [triggers, schedules] or basically everything except those triggers that I specified in only which seems to defeat the purpose of having an only tag in the beginning.

Are there some more details on when these different conditions trigger and what the expected behavior is?