I ask myself these types of questions all the time and the best way to find the answer is to look into the code to see what Cocos2D does underneath the hood. Not only will it help you understand the framework, but the answer someone gives you today may not hold for the next version of Cocos2D (or for the version of Cocos2D that _you_ are using).
If you take a look at CCSpriteFrameCache.m, you will notice that addSpriteFramesWithFile essentially loads the plist into a NSDictionary and passes it onto addSpriteFramesWithDictionary. That method, in turn, creates new instances of CCSpriteFrame objects and pushes them into its internal storage called spriteFrames_ (of type NSMutableDictionary) using:
[spriteFrames_ setObject:spriteFrame forKey:frameDictKey];
So, if two sprite frames have the same name, only a single CCSpriteFrame instance will be kept in the CCSpriteFrameCache's internal spriteFrames_. That said, the actual CCSpriteFrame instance held in the dictionary will change every time addSpriteFramesWithFile is called, even though it will contain the same information and will be analogous to the CCSpriteFrame it will replace.
As far as perf goes, if you do this very often, you should not be loosing memory, but you will likely notice a drop in frame rate because of the load operation and because of the unnecessary alloc and dealloc calls that will take place each time you invoke addSpriteFramesWithFile.