The groupObject variable is a reference to the group object of a group instance that is placed in a scene.
For example, make something like a couch and cushions (which are separated), and place it in another scene. Add the objects to a group (named CouchGroup, for example), and then go to your game scene and add in the group instance. It will make a new object called CouchGroup that contains all of the other objects that are added to the group (which is the couch). This is good, since you can easily and quickly build a level up out of objects that all share properties (i.e. change the shape of one of the couches, and they all change).
At run-time, the BGE adds the game objects that are present in the group. In a more recent build, the groupObject variable was implemented, which allows you to refer to the group object that all objects in the group are ‘added by’. This is useful because you can set specific functions or logic dependent on groups of objects of similar type. For example, say you make it so that couches restore your stamina. With the groupObject variable, you could set a variable in specific couches that change how much stamina is restored without writing a whole other script and creating another group for those other couches. You can then access the property through the group object (object.groupObject).
A (possibly) simple solution to your problem would be to set up global lists (stored in the logic module, or the logic.globalDict dictionary) for your players and your projectiles. Each time a player or projectile is created and initialized, add it to the global list. If it’s deleted, then remove it from the list. When you want to clear the screen, just loop through the lists and end all of the objects you come across. This should be pretty efficient. Even if it isn’t, it probably won’t matter that much since you’re only going to do it once (i.e. clear the screen, and then move on to the next level).