The ? at the end of a destination (destinations are not regular expressions) means to go to that destination with no query string.
RewriteCond %{QUERY_STRING} ^id=(.*)$
RewriteRule ^oldpage\.php$ http://new-site.com/newpage-%1 [R=301,L]
If the query string contains only an id, it stores the value which is then used in the destination, so if you have
http://foo.com/oldpage.php?id=54
you'll end up with
http://new-site.com/newpage-54?id=54
If you have
RewriteCond %{QUERY_STRING} ^id=(.*)$
RewriteRule ^oldpage\.php$ http://new-site.com/newpage-%1? [R=301,L]
You'll go to the same destination but with an empty query string, so going to
http://foo.com/oldpage.php?id=54
will end up in
http://new-site.com/newpage-54