Magic embeds connectivity rules, so each contact layer is representing the connection between layer1 and layer2. Each of the diffusion and poly contacts ultimately results in the output of the same contact cut type in GDS. But there are additional layers, as each contact type will also output the layers on top and bottom, as well as N+ or P+ for diffusions, and the NPC layer for poly as Matt mentioned. By using a separate type for each context, it is also much easier to specify the separate DRC rules for poly contacts vs. diffusion contacts vs. tap contacts.