The amount of freedom should be appropriate to the user and appropriate for the task. If you have a one-time task, constricting the flow with a wizard may be a good choice. However, if it is a task that may be done multiple times, flexibility should be given so that the user can find a flow that best fits their work patterns.
Giving the user the ability to recover from an error by allowing them to undo their last action (when appropriate) can be beneficial.
Allow users multiple different paths to access different facets of an information set. However, strive for simplicity - adding features that meet validated needs, avoiding complexity creep. Known for its simplicity - Google still allows for complex exploration of search results (below).
Thanks for the feedback! It will help us improve your experience.