Great Article. I have been writing SQL Server external objects since 2007 and I have developed some best practices that work for me. You talked on most of them and I wanted to elaborate at bit on one of them.
Do as much of the operation in T-SQL that you can and write small external objects (SQLCLR tasks) to perform the tasks that cannot be done in T-SQL. In my experience, if a task could be done in T-SQL, it will always perform faster than in an external object. I have to admit that the article talked about some scenarios that I have not encounter yet, so testing is still the best way to truly know which has better performance.
Many moons ago I had a project to expose data in an external non-relational proprietary database within SQL Server so DBAs could perform aggregations on this data and also create reports on it , along with many other benefits of having the data in SQL Server (like BI).
Because the proprietary database had a COM SDK, I first tried using the sp_OA procedures. The T-SQL sp_OA procedures (OA stands for OLE Automation) allow SQL Server to run methods in a COM object. This method works for calls that have parameters with data types that map to SQL Server data types, like INTEGER and STRING, but not methods with parameters that do not, like ARRAY and OBJECT. This method did not work for me because the COM object used the data type of OBJECT to pass dates in.
Because I was using SQL Server 2005 I could perform the operation using the SQLCLR. I wrote an operation to connect to the external non-relational proprietary database and get the required data all via the SDK. I wrote the whole operation as one external stored procedure. I was floored when the execution took over 30 minutes to run. After investigating the cause, I discovered that SQL Server did some pre-process tasks that took about 30 minutes to run and the actual tasks I wrote took 3 seconds. Further investigation lead me to believe that SQL Server tries to understand what is required if a rollback is called. I then changed the architecture of the operation to have multiple small SQLCLR tasks with one T-SQL to call them, process the data and then return the results. With this architecture, the tasks run in 3 seconds.
I hope my trial and errors help someone.