There are other languages that allow functions to have output parameters. Living fossil that I am, Pascal springs to mind.
IMHO:
Functions are most appropriate when your typical use case will be to embed the function call into other statements that use the return value. For instance:
s2 = substring( s1, firstSpace( s1 )).
where firstSpace() is a user defined function that returns the offset of the first space character in a string.
Procedures must be RUN - so you cannot embed them in other statements. And if you have more than one return value or output parameter procedures are generally more logical and sensible.
I would be tempted to use a class instead of a function if there is "state" data that is useful to keep outside the scope of a function. With a function that data has to be a variable that could be subject to side-effects. With a class that data becomes a property (which could be kept private) and a method of the class is a straight-forward replacement for a function.
Classes would also be a good replacement for procedures that have many arguments and procedures with multiple output parameters and procedures with "state".
Regarding OO -- it would also help to not have to support v9