Я понял свою ошибку. Я не правильно алгоритм составил.
Нужно:
1. Заменить "</p>" и "<p>" на "\n"
2. Добавить в начало и конец "\n"
3. Заменить "\n" на "</p><p>"
4. Заменить все пробельные символы на пробел
5. Удалить все двойные пробелы
6. Заменить "</p> <p>" на "</p><p>"
7. Заменить " </p>" на "</p>"
8. Заменить "<p> " на "<p>"
9. Заменить все "</p><p></p><p>" на "</p><p>"
10. Удалить "</p>" в начале (если есть)
11. Удалить "<p>" в конце (если есть)
12. Заменить "</p>" на "</p>\n\n"
Есть альтернативный вариант:
1. Заменить "</p>" и "<p>" на "\n"
2. Заменить все пробельные символы за исключением "\n" на пробел
3. Удалить все двойные пробелы
4. Получить массив строк по разделителю "\n" исключая пустые (пробельные) строки
5. Объединить массив в строку используя соединитель "</p>\n\n<p>"
6. Добавить в начало "<p>" и в конец "</p>"
Не знаю, что на JS будет оптимальнее. На C# делал бы 2 вариант.