The more abstract answer which captures the requirements on both imperative-style programming (suitable for hardware register machines) and functional-style programming (suitable for dataflow and graph reduction machines) is that your language must be able to
represent bit strings of arbitrary lengths
express a partial recursive function (to simplify, a partial
recursive function is a computation where the number of steps in a
repetition may not be known before an arbitrary number of iterations
have been run already)
Theoretical Turing machines have #1 by means of the tape, and #2 by means of the states and conditional state transitions. Pure Lambda calculus has #1 by means of lambda-terms of arbitrary lengths, and #2 by means of partial evaluation of fixed point combinators and the truth functions.
In general, if your execution platform "looks like" a Turing machine in that it has a memory for strings and instructions for state transitions, it intuitively satisfies #1 so that does not need discussion. The main question that remains is how to deal with partial recursive functions. A conditional branch and a stack pointer are a way to do it, but other ways are possible as well.