разница большая:
1.
str_replace заменяет исключительно заданные подстроки (один набор символов заменить на другой)
substr_replace заменяет отрезок строки (не важно, какие там символы, важна длина) на подстроку.
2.
str_replace заменяет все имеющиеся совпадения (будет 10 совпадений — замена произойдет 10 раз), плюс к этому можно жестко задать количество замен (по-моему, только с пятой версии)
substr_replace заменяет подстроку только один раз
3.
str_replace может работать с массивами
substr_replace — не может