@Patience this seems like your heading in the right direction. Each state should be for a particular approval level.
The first state would be Submitted and would ideally have a run if (based on the status). If status of request is submitted, then go to state 2. Else it would have a flexi task here to go back to the submitter for edits. The outcomes would be the submitted either rejects or completes. If they complete it, then the outcome would be state 2.
State 2 would be the first approver with a flexi task. The outcome would be reject or accept:
If reject then it goes back to state 1.
If accepts it goes to next state if escalated.
State 3 could be HR.
They get a task if needed, and if they reject it goes back to state 1 for edits
If they accept or approve then it continues
To get the different departments you could create a list with those department email aliases listed and then in the form when the user selects the department they want to post in, you could query the list to figure out who to send the task for approval to. Fairly easy work.