Q1: Best to move the screen to a user-task an loop-back. This allows you to have the process persisted with the right state and variables and there is no need to have duplicate logic (both for rendering start-form and rendering task-form with the same form).
Q2: You can just store the assignee the user selected as a process-variable. In the next task where the assignee should be set, use 'activiti:assignee="${assigneeSelectedWhenStarted}"' or use the BPMN2.0 counterpart (see user guide).
Q3: Again, use a process-variable so it's persistent and independent of environment (CDI). Use a gateway with conditions on the flow (e.g.. {$approved == "Yes"}, so it goes to a userTask with activiti:assignee="${initiator}" (having activiti:initiator="initiator" on you start-event).
Q4: Best to do this from the process itself, so all logic related to the process (getaways, tasks, DB-writes) is bundled and contained in one place to have a good overview.
Q5: If you're using JTA and the final task.complete() generates an exception, bot activiti entities and your custom entities will be rolled back. You can just show the error-message and the task WILL NOT be completed and will still be available. It's like the complete never happened…