The question is, "why do new languages still have statements and not expressions exclusively?", right?
Programming language designs address different problems, e.g.
- simple grammar,
- simple implementation,
- simple semantics
being among the more theoretical design goals and
- execution speed of resulting compiled code
- compilation speed
- resource consumption of executing programs
- ease of use (e.g. simple to read)
being among the more practical ones ...
These design goals have no clear cut definitions, e.g. a short grammar is not necessarily the one with the cleanest structure, so which one is simpler?
(considering your example)
For ease of use or code readability a language designer might require you to write 'return', in front of the value (or rather the expression) resulting from a function. This is a return statement. If you can leave out the 'return', it is still implied and it could still be considered as a return statement (it just would not be so obvious in the code). If it is considered as an expression, this implies substitution semantics, like e.g. Scheme, but probably not Python. From a syntactical stand point it makes sense to distinguish statements and expressions, where 'return' is required.
Looking at machine code (which I didn't do much, so I might be wrong) it seems to me there are only statements, no expressions.
E.g. your example:
ld r1, 5
ld r2, 5
add r3, r1, r2
ret r3
(I'm making this up, obviously)
So for people that like to think in terms of how a (von Neumann) CPU core actually operates, or who want to simplify compilation for such a target architecture, statements are the way.
There is also the particular 'evil' (as in non-functional) assignment statement. It is required for expressing terminating loops without recursion. According to Dijkstra, loops have simpler semantics than recursion (ref. E.W. Dijkstra, "A Discipline of Programming" 1976). A loop executes faster and consumes less storage than recursion. Unless your language optimizes for tail recursion (like Scheme).