Genetic algorithms are metaheuristic search methods, based on the principles of biological evolution and genetics. Through a heuristic search they are able to find good solutions in acceptable time. However, with the increase of the complexity of the fitness landscape and the size of the search space their runtime increases rapidly. Using parallel implementations of genetic algorithms in order to harness the power of modern computational platforms, is a powerful approach to mitigating this issue. In this paper several parallel implementations ranging from MPI to hybrid MPI/OpenMP and MPI/OmpSs are made. These implementations are optimized for execution on tightly coupled distributed memory systems. We address issues that arise when running a distributed genetic algorithm and present an adaptive migration scheme. Comparison of their efficiency is also made.