A numerical id will still be faster than a char, if I'm not mistaken.
For the original question, I think the best balance of simplicity vs performance is using an int id and a join for the username. This is the "conventional" way to structure a relation of this sort. Don't optimize prematurely: start with the conventional approach, and then if you see that in practice, the query's performance is a bottleneck, then consider optimizing it.
The reason why optimizing prematurely can be bad is that often, the real bottlenecks are in different spots than you first think. So it's best to have concrete evidence in the form of performance profiling, and only then optimizing, starting with what can be improved the most.