Voy con una respuesta diferente aquí: prácticamente hablando, realmente no hay diferencia , con la ligera excepción de que "método" generalmente se refiere a una subrutina asociada con un objeto en lenguajes OO.
Los términos "procedimiento, función, subrutina, subprograma y método" realmente significan lo mismo: un subprograma invocable dentro de un programa más grande. Pero es difícil llegar a una definición que capture todos los usos variantes de estos términos, porque no se usan de manera consistente en los lenguajes o paradigmas de programación.
Se podría decir que una función devuelve un valor. Bueno, la siguiente función C no devuelve un valor:
void f() { return; }
... pero dudo que encuentres a alguien que lo llame un procedimiento.
Claro, en Pascal, los procedimientos no devuelven valores y las funciones devuelven valores, pero eso es simplemente un reflejo de cómo se diseñó Pascal. En Fortran, una función devuelve un valor y una subrutina devuelve múltiples valores. Sin embargo, nada de esto realmente nos permite llegar a una definición "universal" para estos términos.
De hecho, el término "programación procesal" se refiere a toda una clase de lenguajes, incluidos C, Fortran y Pascal, de los cuales solo uno realmente utiliza el término "procedimiento" para significar algo.
Entonces nada de esto es realmente consistente. La única excepción es probablemente el "método", que parece usarse casi por completo con los lenguajes OO, refiriéndose a una función asociada con un objeto. Aunque, incluso esto no siempre es consistente. C ++, por ejemplo, usualmente usa el término "función miembro" en lugar de método (aunque el término "método" se ha infiltrado en la lengua vernácula C ++ entre los programadores).
El punto es que nada de esto es realmente consistente. Simplemente refleja la terminología empleada por cualquier idioma que esté en boga en ese momento.