so this is what I've put together.
I've created 3 lists:
RequestTypes - list of all possible request types
RequestSteps - list of all steps per request types
Requests - list of requests submitted
the list have fields
then I built a workflow on Requests list.
the workflow basically just takes care of processing of one single step.
first it checks whether any step(s) has already been processed. if not, it assumes new request and start processing from first step (one with lowest StepNbr).
then RequestSteps list is queried - it gets a step with lowest StepNbr greater then already handled step for given request type
then similar query is performed on RequestSteps list just to get collection of all steps for a given request type, to get total number of steps that needs to be handled
if there is no further step found, RequestStatus is updated to 'Processed' and statistical fields CurrentStep and TotalSteps are cleared.
if a step is found, CurrentStep field is updated and a task is assigned.
I used flexi task with no branching and single approval outcome, just to confirm the step is done.
once the task is responded I use start workflow action to restart the same workflow on the same item once again.
just to overcome limitation of single workflow instance running on an item I used a 'helper' workflow. helper workflow does nothing but starting main workflow after short delay.
this is whole processing workflow.
so, this should provide fully flexible approach on processing requests.
one can even redefine processing steps on the fly for requests already being processed. if anything goes wrong and workflow fails, one can simply start it manually and processing will continue where it left off.
list of steps need not necessarily be dense filled, so if one removes some steps, he need not renumber rest of steps.