Eu vou com uma resposta diferente aqui: praticamente falando, não há realmente nenhuma diferença , com a pequena exceção de que "método" geralmente se refere a uma sub-rotina associada a um objeto nas linguagens OO.
Os termos "procedimento, função, sub-rotina, subprograma e método" realmente significam a mesma coisa: um subprograma que pode ser chamado dentro de um programa maior. Mas é difícil chegar a uma definição que capture todos os usos variantes desses termos, porque eles não são usados consistentemente em linguagens ou paradigmas de programação.
Você pode dizer que uma função retorna um valor. Bem, a seguinte função C não retorna um valor:
void f() { return; }
... mas duvido que você encontre alguém que chame isso de procedimento.
Certamente, em Pascal, os procedimentos não retornam valores e as funções retornam valores, mas isso é apenas um reflexo de como Pascal foi projetado. No Fortran, uma função retorna um valor e uma sub-rotina retorna vários valores. No entanto, nada disso realmente nos permite chegar a uma definição "universal" para esses termos.
De fato, o termo "programação procedural" refere-se a toda uma classe de linguagens, incluindo C, Fortran e Pascal, apenas uma das quais realmente usa o termo "procedimento" para significar alguma coisa.
Portanto, nada disso é realmente consistente. A única exceção é provavelmente "método", que parece ser usado quase inteiramente com linguagens OO, referindo-se a uma função associada a um objeto. Embora isso nem sempre seja consistente. C ++, por exemplo, geralmente usa o termo "função membro" em vez de método (mesmo que o termo "método" tenha entrado no vernáculo do C ++ entre os programadores.)
O ponto é que nada disso é realmente consistente. Simplesmente reflete a terminologia empregada por qualquer idioma em voga na época.