Estou indo com uma resposta diferente aqui: praticamente falando, realmente não há diferença , com a pequena exceção de que "método" geralmente se refere a uma sub-rotina associada a um objeto em idiomas OO.
Os termos "procedimento, função, sub-rotina, subprograma e método" realmente significam a mesma coisa: um sub-programa que pode ser chamado dentro de um programa maior. Mas é difícil encontrar uma definição que capture todos os usos variantes desses termos, porque eles não são usados consistentemente em linguagens de programação ou paradigmas.
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 possa chamar isso de procedimento.
Claro, em Pascal, os procedimentos não retornam valores e funções retornam valores, mas isso é apenas um reflexo de como o Pascal foi projetado. Em 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, sendo que apenas uma delas realmente usa o termo "procedimento" para significar qualquer 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 que está associada a um objeto. Embora nem sempre isso seja consistente. C ++, por exemplo, geralmente usa o termo "função de membro" em vez de método (embora o termo "método" tenha penetrado no vernáculo de C ++ entre programadores).
O ponto é que nada disso é realmente consistente. Simplesmente reflete a terminologia empregada por quaisquer idiomas que estejam em voga na época.