.Net BeginInvoke simply postpones the execution into a different thread. This will be always slower than a synchronous call and consume extra resources. The only reason why this would be used would be to free the caller context to proceed to other operations (eg. return an the result of an HTTP request to the client).
SqlClient asynchronous methods, when the AsynchronousProcessing property on the connection is set to true and the BeginExecute methods of SqlCommand are used, are truly asynchronous. The SQL command is posted to the network communication channel and the completion is invoked when the result is returned by the server.
From a reliability point of view though neither of these methods is useful though. They both rely on the client process to stay around until the call is completed, otherwise the SQL Server would see the client disconnect and abandon processing, rolling back any intermediate work. Consider an ASP application that accepted an HTTP request, submitted an 'asynchronous' payment processing and returned an response. There isn't any way to guarantee that the submitted work will actually occur.
For situations when the processing requires reliability guarantees the solution is queue up the work on the server, commit it and then proceed, relying on SQL Server's own asynchronous processing capabilities. This is a method that guarantees the processing even on the presence of client disconnects, ASP process 'recycling', SQL Server mirroring or clustering failovers, hardware disaster recovery, pretty much anything you can throw at it, since is a transactionaly durable way of submitting asynchronous processing requests. For an example see Asynchronous Procedure Execution.