In general it is a good idea to do "everything" with events. Not only the workflow start/triggering but you should try to build the workflow in a way that its steps are listening events. Tasks can be listening to events (APPROVED, REJECTED, whatever). (Of course decision steps are a bit different matter.) This way you will separate the workflow from the UI. If someday the UI needs to be replaced or a new UI will be developed (UI5 or whatever), you don't need to know the details of the workflow - the UI(s) just needs to trigger the events. If no-one is listening to the events, it doesn't matter - no short dumps, no errors, etc.
It is not so critical that from where you trigger the events (functions, "wrapper functions", methods, etc). Just build them in a way that they can be easily called without knowing anything about the workflow.
Regards,
Karri