when you put "plain old native functions" in an array, with the intent of executing them in sequence, with the output of i being fed into the input of i+1, congratulations, the functions are now implicitly promises.
Because, in the end, what, semantically, is the difference between:
runqueue([func1,func2,func3,func4]);
and
func1().then(func2).then(func3).then(func4);
No significant difference at all, really. except the promises permit you much more flexibility and options.