What about this alternative: in the aggregate constructor apply an extra event:
public GiftCard(IssueCardCommand cmd) {
...
apply(new CardIssuedEvent(...);
apply(new CardRedeemedEvent(/*defaults*/);
}
This would avoid the replay issues and still work for both types of aggregates, wouldn't it?