What's the difference between fetch and fetch next?
There is no difference, and omitting NEXT will not lead to duplicates or different results in any way. NEXT is just an explicit declaration of the default behavior. From the syntax diagram:

FETCH   
      [ [ NEXT | PRIOR | FIRST | LAST   
                | ABSOLUTE { n | @nvar }   
                | RELATIVE { n | @nvar }   
           ]   
           FROM   


NEXT is not the only option, and most of the other options are only available with certain types of cursors. It's hard for me to get into this habit, because I exclusively use fast-forward, single-pass, "firehose" cursors, but best practice is to include NEXT explicitly.

I would look at the query, as I suspect it will also be returning duplicates when there is no cursor involved. Or, whatever the stored procedure is doing, is making it seem like there are duplicates. Another possible explanation is if the query is using WITH (NOLOCK) / READUNCOMMITTED and you are reading the same row twice in an allocation order scan due to data movement.