Instead of assigning an Elastic IP to an EC2 instance, can I just CNAME a URL to the instance's public DNS name?
Yes, you can do that however the instances public DNS name will change any time an instance is started up. The best options are to either use the elastic IP (EIP) or work behind an elastic load balancer (ELB). Both options would be better to point a DNS entry to and would be able to remain the same on instance restarts. You would use a CNAME entry for ELB and you could use either an A or CNAME record for the EIP option. The advantage of the ELB option is that you could have multiple EC2 instances behind it giving you greater fault tolerance.