Vamos fazer quem nem Jack (vamos por partes):
EJB -> Local, é muito usado para acessos a base de dados (insert, update, delete, etc), chamar outros serviços(EJBs), é usado geralmente na mesma aplicação que irá utilizar o serviço EJB, é usado EJB pelas vantagens de controle de transação, injeção de dependencias e inversão de controle.
EJB -> Remoto, geralmente é usado para integrar outros sistemas em java que utilizam EJB, por exemplo vc tem um sistema que tem a funcionalidade de fazer cotação de moeda, e vc está desenvolvendo um outro sistema que precisa da mesma funcionalidade e vc integra os dois sistemas que estão em servidores de aplicação distintos(JVM), e tem as mesmas vantagens do EJB local.
Por baixo dos panos vc está utilizando RMI, que por traz usando sockets, mas a JNDI já facilita muito tudo isso pra vc, e o Servidor de aplicação já faz os lookups pra vc, basta configurar.
Webservices -> geralmente usado para integrar sistemas independente da linguagem, vc pode ter um serviço WS rodando em Java com um cliente em PHP por exemplo, e para se entenderem utilizam o XML.
Espero ter ajudado.
flw!