The workflow rules would fire after the
upsert (insert/update), so I wouldn't expect that to be the cause of your problem. Also, existing records would already have an ID associated with them while new ones wouldn't. Unless there's something about your coding that's inserting new records because the Id isn't following along with existing records, I wouldn't think the
upsert would be the cause.
From what you're describing, it's the workflow that adds the data for the new fields, so if anything, you'd be doing an update to an existing record causing an update to fire and the
ISNEW() in the workflow to be returned as false.
As always, without seeing specific code, one can't fully evaluate a specific situation. But that's my analysis based on your description of your situation. Obviously, it's always preferable to use
insert when you know it's a new record and
update when you know it's an edit to an existing record. To me, that would be a "best practice".