Adding a point from a button click can be as simple as:
dojo.connect(dojo.byId('pointButton'), 'onclick', function() {
map.graphics.add(new esri.Graphic(
// Point coordinates are 0, 0
new esri.geometry.Point(0, 0, map.spatialReference),
new esri.symbol.SimpleMarkerSymbol()
));
});
And the pointButton node is:
<button id="pointButton">Click to add a point.</button>
To add a point when the map is clicked is pretty straightforward as well:
dojo.connect(map, 'onClick', function(evt) {
map.graphics.add(new esri.Graphic(
evt.mapPoint,
new esri.symbol.SimpleMarkerSymbol()
));
});
Live example showing both here: http://jsfiddle.net/swingley/auyHf/
Regarding converting from lat, long to another coordinate system: if you're converting to or from lat, long to web mercator, there are client side methods available to do this: esri.geometry.geographicToWebMercator and esri.geometry.WebMercatorToGeographic. If you need to convert from lat, long to something other than web mercator, then the geometry service's project method is the way to go.
A feature service returns graphics that the client browser must render. If you used a MapServer service you might have better results. 50k features is a lot to display, a heat map might be a better approach for performance and usability. If your data does not change very often, a tiled layer map be your best bet.
Best Answer
As of 2018, there is a new sample that shows and explains some FeatureLayer Performance Improvements for version 4.6.