The question is what does it mean to “execute some code immediately after workflow completion”?
For example if this code fails should it be retried? If retried for how long? What if this code need to execute multiple steps? After thinking about such requirements you realize that such code should be a part of a workflow.
One alternative that we are considering is to support sending a message to some external queue upon workflow completion. As most queues provide durability and other guarantees it might unblock some of the use cases above.