O save() é utilizado para objetos novos, que não possuem um identifier ainda. Enquanto o merge() é utilizado para um objeto já existente, com um identifier, porém não pertence a um context (não está gerenciado).
Não sei exatamente o Hibernate, mas segundo a especificação da JPA, você pode utilizar tanto o persist() (mesmo que o save() do hibernate) como o merge() em um objeto NOVO, enquanto se você usar o persist() em um objeto com um identifier, você irá receber uma exceção (EntityExistsException).
Não!! Embora em teoria o merge() faça o mesmo papel do persist() no caso de objetos novos (eu lí isso mas não testei na prática), lembre-se que o código limpo e claro fala-se por sí só. Uma pessoa diferente que for dar manutenção e ler merge() ao invés de persist(), pode ter um outro entendimento.
Eu tenho um exemplo aqui que se usa merge() em um e save() em outro, só não entendi o motivo:
Session session = HibernateUtil.currentSession();
Dao<Fornecedor> dao = new Dao<Fornecedor>(session,Fornecedor.class);
dao.merge(this.fornecedor);
this.fornecedor = new Fornecedor();
Session session = HibernateUtil.currentSession();
Dao<Fornecedor> fornecedorDao = new Dao<Fornecedor>(session,Fornecedor.class);
Dao<ContaPagar> contaPagarDao = new Dao<ContaPagar>(session,ContaPagar.class);
Long id = Long.valueOf(fornecedorSelecionado.getValue().toString());
Fornecedor f = fornecedorDao.load(id);
contaPagar.setFornecedor(f);
contaPagarDao.merge(contaPagar);
contaPagar = new ContaPagar();