If you're a very old programmer like me you may have written stuff like this early on:

    DIM A, B, C
    LET A = 2
    LET B = 2
    GOSUB ADD
    PRINT C
    END
    ADD:
    LET C = A + B
    RETURN

(Actually, if you're an assembly programmer, you may be stuck writing stuff like this anyway, but let's not digress.)

Of course the modern approach would be more like this:

    var c = Add(2,2);
    Print(c);

I understand the first pattern is obviously "bad;" that is not under dispute. I'm just trying to [explain to another engineer](https://softwareengineering.stackexchange.com/a/404762/115084) the specific technical reasons why, without injecting my own opinion. A good answer will strive to be exhaustive, and stick to technical reasons, risks, and potentially cite known code smells or other authoritative sources.