Voy con una respuesta diferente aquí: prácticamente hablando, realmente no hay diferencia , con la pequeña excepción de que "método" generalmente se refiere a una subrutina asociada con un objeto en idiomas OO.
Los términos "procedimiento, función, subrutina, subprograma y método" realmente significan lo mismo: un subprograma que se puede llamar 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, ya que no se usan de manera consistente en lenguajes de programación o paradigmas.
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 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 varios valores. Sin embargo, nada de esto realmente nos permite crear una definición "universal" para estos términos.
De hecho, el término "programación de procedimientos" se refiere a toda una clase de lenguajes, incluidos C, Fortran y Pascal, solo uno de los cuales usa el término "procedimiento" para significar algo.
Así que nada de esto es realmente consistente. La única excepción es probablemente el "método", que parece ser usado casi en su totalidad con lenguajes OO, en referencia a una función que está asociada con un objeto. Aunque, incluso esto no siempre es consistente. C ++, por ejemplo, generalmente usa el término "función miembro" en lugar del método, (aunque el término "método" se haya introducido en la lengua vernácula de C ++ entre los programadores).
El punto es que nada de esto es realmente consistente. Simplemente refleja la terminología empleada por los idiomas que están en boga en ese momento.