In order to answer questions like that, generally, it's super helpful if you will include the "EXPLAIN" output for the query. It may also be useful to share some simple DDL stuff so we can create the tables and data you're using and try it out on our end.
In this specific case (without digging too much into this, and without the info above) I'd guess there's an index missing and probably on the field "realisation_category_id"
Why is too much difference in time execution between these two queries:
SELECT rc.id AS id, rc.name FROM realisation_category rc WHERE EXISTS ( SELECT * FROM realisation r, post p WHERE (r.realisation_category_id = rc.id AND r.site_id = 1) OR (p.realisation_category_id = rc.id AND p.site_id = 1) ) [2016-06-03 01:23:12] 35 row(s) retrieved starting from 1 in 14s 591ms (14s 612ms total)
SELECT rc.id AS id, rc.name FROM realisation_category rc WHERE EXISTS ( SELECT * FROM realisation r WHERE r.realisation_category_id = rc.id AND r.site_id = 1 ) OR EXISTS ( SELECT * FROM post p WHERE p.realisation_category_id = rc.id AND p.site_id = 1 ) [2016-06-03 01:25:25] 35 row(s) retrieved starting from 1 in 64ms (86ms total)